SceneNumber extending sequence而來,作為場景的計數器。需要留意的是每一個sequence可以被多個property呼叫,共享同一個計數器。如果單一property需要獨立的計數器,需要各別extending sequence生成特定的sequence。
scalar type SceneNumber extending sequence;
Event有一個detail property及三個multi link用來協助記錄相關的人時地。
abstract type Event {
detail: str;
multi who: Character;
multi `when`: FuzzyTime;
multi where: Place;
}
由於when是EdgeDB語法的關鍵字,所以必須使用加上backtick的`when`。這邊需要留意,一旦使用backtick,那麼以後所有的EdgeQL操作中,引用到此property時或link時都要繼續使用backtick,也就是以後所有的query中,都必須使用`when`,而非when。使用者需要視習慣,決定使用此語法或另外命名一個例如when_的名字。
Scene extending Event而來,用來記錄各場景資訊。
type Scene extending Event {
title: str;
remarks: str;
references: array<tuple<str, str>>;
required scene_number: SceneNumber {
constraint exclusive;
default := sequence_next(introspect SceneNumber);
}
index on (.scene_number);
}
其有四個property:
title property為標題。remarks property為註解。references property為參考資料連結。scene_number property為自動產生編號的計數器。
sequence_next()作為scene_number的default,可以在每次insert新Scene時,自動產生編號(註2)。其中introspect是不可省略的關鍵字,原因是sequence_next()接收的參數必須是ScalarType,詳細的說明請參考Easy EdgeDB 第十三章。introspection是一個非常強大可以輔助探索EdgeDB內部的工具,但對於初學者而言,可能只會在使用sequence時才會遇到,所以這邊我們省略不提。此外,由於我們可能會常順向或逆向存取Scene,所以替scene_number加上了index(註3)。
註1:這邊比較有趣的一點是,exclusive有提到Scalar type definitions cannot include this constraint.,但是sequence的範例卻是可以加上exclusive constraint。
註2:根據sequence的範例,或許此default := sequence_next(introspect SceneNumber);可以省略。
註3:一般而言,EdgeDB會隱性地將擁有exclusive constraint的property加上index,所以理論上,我們可能不需要自己再加一次。但是因為註1的原因,為保險起見,我們於此處顯性地加上index on (.scene_number);。